package com.ssy.lingxi.logistics.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.logistics.api.dto.request.*;
import com.ssy.lingxi.logistics.api.dto.response.FreightResponse;
import com.ssy.lingxi.logistics.api.dto.response.OrderSeparateFreightListResponse;
import com.ssy.lingxi.logistics.model.request.CommonStatusRequest;
import com.ssy.lingxi.logistics.model.request.FreightTemplateListRequest;
import com.ssy.lingxi.logistics.model.request.FreightTemplateRequest;
import com.ssy.lingxi.logistics.model.request.OrderProductListRequest;
import com.ssy.lingxi.logistics.model.response.FreightTemplateListResponse;
import com.ssy.lingxi.logistics.model.response.FreightTemplateResponse;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 运费模板服务类
 *
 * @author yzc
 * @version 2.0.0
 * @date 2020/7/14
 */
public interface IFreightTemplateService {

    /**
     * 运费模板分页列表
     * @param request 接口参数
     * @param loginUser 登录用户信息
     * @return 返回结果
     */
    Wrapper<PageData<FreightTemplateListResponse>> pageFreightTemplate(FreightTemplateListRequest request, UserLoginCacheDTO loginUser);

    /**
     * 运费模板查询
     * @param id 主键id
     * @return 返回结果
     */
    Wrapper<FreightTemplateResponse> getFreightTemplate(Long id);

    /**
     * 运费模板添加
     * @param request 接口参数
     * @param loginUser 登录用户信息
     */
    Wrapper<Void> addFreightTemplate(FreightTemplateRequest request, UserLoginCacheDTO loginUser);

    /**
     * 运费模板修改
     * @param request 接口参数
     * @param loginUser 登录用户信息
     */
    Wrapper<Void> updateFreightTemplate(FreightTemplateRequest request, UserLoginCacheDTO loginUser);

    /**
     * 运费模板停用/启用
     * @param request 接口参数
     * @param loginUser 登录用户信息
     * @return 返回结果
     */
    Wrapper<Void> updateStatusFreightTemplate(CommonStatusRequest request, UserLoginCacheDTO loginUser);

    /**
     * 运费模板删除
     * @param request 接口参数
     * @param loginUser 登录用户信息
     * @return 返回结果
     */
    Wrapper<Void> deleteFreightTemplate(CommonIdRequest request, UserLoginCacheDTO loginUser);

    /**
     * 计算运费
     */
    Wrapper<BigDecimal> calFreightPrice(OrderProductListRequest request);

    /**
     * 内部接口 - 计算运费
     */
    Wrapper<BigDecimal> calFreightPrice(OrderFreightRequest request);

    /**
     * 内部接口 - 计算运费
     */
    Wrapper<List<FreightResponse>> batchCalFreightPrice(List<TransferOrderFreightRequest> requestList);

    /**
     * 内部接口 - 批量查询运费（拆单）
     * @param products 拆单后的商品信息列表
     * @return 查询结果
     */
    Wrapper<Map<OrderSeparateFreightRequest, BigDecimal>> findSeparateOrderFreight(Map<OrderSeparateFreightRequest, List<OrderSeparateProductFreightDetail>> products);

    /**
     * 内部接口 - 批量查询运费（拆单）
     * @param requests 拆单后的供应商及商品信息列表
     * @return 查询结果
     */
    Wrapper<List<OrderSeparateFreightListResponse>> findSeparateOrderFreight(List<OrderSeparateFreightListRequest> requests);
}
